package com.msb.lmsc;

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

public class Test implements Serializable {
    public static void main(String[] args) {
        int choice = 0;
        Scanner sc = new Scanner(System.in);
        ArrayList<Book> list = null; // 初始化为空

        try {
            // 加载现有书籍列表 空集合
            list = loadBooksFromFile(new File("f:\\book.txt"));
            if (list == null) {
                list = new ArrayList<>(); // 如果文件为空，则创建一个新的空集合
            }

            while (choice != 4) {
                // 打印菜单
                System.out.println("【老马书城集合版】");
                System.out.println("1.展示书籍");
                System.out.println("2.上线书籍");
                System.out.println("3.下架书籍");
                System.out.println("4.退出应用");
                System.out.println("请选择操作：");
                choice = sc.nextInt();

                switch (choice) {
                    case 1:
                        displayBooks(list);
                        break;
                    case 2:
                        addBook(sc, list);
                        break;
                    case 3:
                        removeBook(sc, list);
                        break;
                    case 4:
                        System.out.println("退出应用-------");
                        break;
                    default:
                        System.out.println("输入有误，请重新输入");
                }

                // 保存列表到文件
                saveBooksToFile(list);
            }
        } finally {
            sc.close();
        }
    }

    /**
     * 显示书籍列表中的书籍信息。
     *
     * @param books 包含书籍信息的 ArrayList 对象。
     */
    private static void displayBooks(ArrayList<Book> books) {

        // 输出表头信息
        System.out.println("展示书籍:");
        System.out.println("编号\t名称\t作者\t价格");

        // 遍历书籍列表
        for (Book book : books) {
            // 输出每一本书的信息
            System.out.println(book.getbNo() + "\t" + book.getbName() + "\t" + book.getbAuthor() + "\t" + book.getbPrice());
        }
    }

    /**
     * 添加书籍到书籍列表中。
     * @param scanner
     * @param books
     */
    private static void addBook(Scanner scanner, ArrayList<Book> books) {
        // 接收输入的信息
        System.out.println("上线书籍----------");
        System.out.println("请录入书籍的编号：");
        int bNo = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符
        System.out.println("请录入书籍的名称：");
        String bName = scanner.nextLine();
        System.out.println("请录入书籍的作者：");
        String bAuthor = scanner.nextLine();
        System.out.println("请录入书籍的价格：");
        double bPrice = scanner.nextDouble();
        scanner.nextLine(); // 消耗换行符

        // 创建书籍对象并添加到集合中
        Book book = new Book(bNo, bName, bAuthor, bPrice);
        books.add(book);
    }

    private static void removeBook(Scanner scanner, ArrayList<Book> books) {
        System.out.println("下架书籍---------");
        System.out.println("请输入要下架书籍的编号：");
        int deleteNo = scanner.nextInt();
        // 使用 removeIf 方法移除列表中所有编号为 deleteNo 的书籍
        // book.getbNo() == deleteNo 是一个 Lambda 表达式，用于检查每个 Book 对象的 bNo 是否等于 deleteNo
        books.removeIf(book -> book.getbNo() == deleteNo);
    }

    private static void saveBooksToFile(ArrayList<Book> books) {
        File file = new File("f:\\book.txt");
        try (FileOutputStream fos = new FileOutputStream(file);
             ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            oos.writeObject(books);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 从指定的文件中加载书籍列表。
     *
     * @param file 文件对象，代表要从中读取书籍列表的文件。
     * @return 返回从文件中读取的书籍列表，如果文件不存在或为空，则返回一个空的 ArrayList。
     */
    private static ArrayList<Book> loadBooksFromFile(File file) {

        // 初始化一个Book类型的空集合，用于存放读取到的书籍
        ArrayList<Book> books = new ArrayList<>();

        // 检查文件是否存在且长度大于0，防止读取空文件或不存在的文件
        if (file.exists() && file.length() > 0) {
            try (FileInputStream fis = new FileInputStream(file); // 创建FileInputStream来读取文件
                 ObjectInputStream ois = new ObjectInputStream(fis)) { // 创建ObjectInputStream用于读取序列化的对象
                // 使用readObject方法从文件中读取序列化的对象
                // 注意这里假设文件中只存储了一个对象，即书籍列表
                books = (ArrayList<Book>) ois.readObject();
            } catch (EOFException e) {
                // 如果发生EOFException，说明文件可能为空或者内容不符合预期
                // 这里简单打印一条消息
                System.out.println("文件内容不符合预期或为空.");
            } catch (IOException | ClassNotFoundException e) {
                // 如果发生IOException或ClassNotFoundException，输出堆栈跟踪
                e.printStackTrace();
            }
        }

        // 返回从文件中读取的书籍列表
        return books;
    }
}